﻿#include "TlvPrjModelParser.h"
#include <QFile>
#include <QDebug>

TlvPrjModelParser::TlvPrjModelParser()
    : IModelParser<TlvPrjModel>()
{
}

QString TlvPrjModelParser::toString(const TlvPrjModel &model)
{
    QJsonObject root;

    // 添加项目名称
    root["name"] = model.name;
    root["hex_file"] = model.hex_file;

    // 添加命令页面数组
    QJsonArray cmdsArray;
    for (const CmdPageModel &page : model.cmds) {
        cmdsArray.append(cmdPageToJson(page));
    }
    root["cmds"] = cmdsArray;

    // 添加代码片段数组
    QJsonArray codesArray;
    for (const CodePageModel &code : model.codes) {
        codesArray.append(tlvCodeToJson(code));
    }
    root["codes"] = codesArray;

    setLastError("");
    // 创建 JSON 文档并转换为字符串
    QJsonDocument doc(root);
    return doc.toJson(QJsonDocument::Indented);
}

IICCmdModel TlvPrjModelParser::parseIICCmd(const QJsonObject &json)
{
    IICCmdModel cmd;
    cmd.title = json["title"].toString();
    cmd.wait = json["wait"].toString();

    QJsonObject valueObj = json["value"].toObject();
    cmd.value.addr = valueObj["addr"].toString();
    cmd.value.hexstring = valueObj["hexstring"].toString();
    cmd.value.readlen = valueObj["readlen"].toString();

    return cmd;
}

TlvCmdModel TlvPrjModelParser::parseTlvCmd(const QJsonObject &json)
{
    TlvCmdModel cmd;
    cmd.title = json["title"].toString();
    cmd.wait = json["wait"].toString();

    QJsonObject valueObj = json["value"].toObject();
    cmd.value.tag = valueObj["tag"].toString();
    cmd.value.hexstring = valueObj["hexstring"].toString();

    return cmd;
}

CmdPageModel TlvPrjModelParser::parseCmdPage(const QJsonObject &json)
{
    CmdPageModel page;
    page.name = json["name"].toString();

    // 解析 IIC 命令数组
    if (json.contains("iic") && json["iic"].isArray()) {
        QJsonArray iicArray = json["iic"].toArray();
        for (const QJsonValue &value : iicArray) {
            if (value.isObject()) {
                page.iic.append(parseIICCmd(value.toObject()));
            }
        }
    }

    // 解析 TLV 命令数组
    if (json.contains("tlv") && json["tlv"].isArray()) {
        QJsonArray tlvArray = json["tlv"].toArray();
        for (const QJsonValue &value : tlvArray) {
            if (value.isObject()) {
                page.tlv.append(parseTlvCmd(value.toObject()));
            }
        }
    }

    return page;
}

CodePageModel TlvPrjModelParser::parseTlvCode(const QJsonObject &json)
{
    CodePageModel code;
    code.name = json["name"].toString();
    code.title = json["title"].toString();
    code.code = json["code"].toString();
    return code;
}

TlvPrjModel TlvPrjModelParser::parseFromJson(const QJsonObject &json)
{
    TlvPrjModel project;

    // 解析项目名称
    if (json.contains("name") && json["name"].isString()) {
        project.name = json["name"].toString();
    }

    // 解析烧录文件路径
    if (json.contains("hex_file") && json["hex_file"].isString()) {
        project.hex_file = json["hex_file"].toString();
    }

    // 解析命令页面数组
    if (json.contains("cmds") && json["cmds"].isArray()) {
        QJsonArray cmdsArray = json["cmds"].toArray();
        for (const QJsonValue &value : cmdsArray) {
            if (value.isObject()) {
                project.cmds.append(parseCmdPage(value.toObject()));
            }
        }
    }

    // 解析代码片段数组
    if (json.contains("codes") && json["codes"].isArray()) {
        QJsonArray codesArray = json["codes"].toArray();
        for (const QJsonValue &value : codesArray) {
            if (value.isObject()) {
                project.codes.append(parseTlvCode(value.toObject()));
            }
        }
    }
    setLastError("");
    return project;
}

QJsonObject TlvPrjModelParser::iicCmdToJson(const IICCmdModel& cmd)
{
    QJsonObject cmdObj;
    cmdObj["title"] = cmd.title;
    cmdObj["wait"] = cmd.wait;

    QJsonObject valueObj;
    valueObj["addr"] = cmd.value.addr;
    valueObj["hexstring"] = cmd.value.hexstring;
    valueObj["readlen"] = cmd.value.readlen;

    cmdObj["value"] = valueObj;
    return cmdObj;
}

QJsonObject TlvPrjModelParser::tlvCmdToJson(const TlvCmdModel& cmd)
{
    QJsonObject cmdObj;
    cmdObj["title"] = cmd.title;
    cmdObj["wait"] = cmd.wait;

    QJsonObject valueObj;
    valueObj["tag"] = cmd.value.tag;
    valueObj["hexstring"] = cmd.value.hexstring;

    cmdObj["value"] = valueObj;
    return cmdObj;
}

QJsonObject TlvPrjModelParser::cmdPageToJson(const CmdPageModel& page)
{
    QJsonObject pageObj;
    pageObj["name"] = page.name;

    // 添加 IIC 命令数组
    QJsonArray iicArray;
    for (const IICCmdModel &cmd : page.iic) {
        iicArray.append(iicCmdToJson(cmd));
    }
    pageObj["iic"] = iicArray;

    // 添加 TLV 命令数组
    QJsonArray tlvArray;
    for (const TlvCmdModel &cmd : page.tlv) {
        tlvArray.append(tlvCmdToJson(cmd));
    }
    pageObj["tlv"] = tlvArray;

    return pageObj;
}

QJsonObject TlvPrjModelParser::tlvCodeToJson(const CodePageModel& code)
{
    QJsonObject codeObj;
    codeObj["name"] = code.name;
    codeObj["title"] = code.title;
    codeObj["code"] = code.code;
    return codeObj;
}
